package password;

/**
 * 恺撒移位密码:通过把字母移动一定的位数来实现加密和解密。
 * 明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
 * 例如，当偏移量是3的时候，所有的字母A将被替换成D，B变成E，以此类推X将变成A，Y变成B，Z变成C。
 * 由此可见，位数就是凯撒密码加密和解密的密钥
 * @author Administrator
 *
 */
public class KaisaCode {
	
	private static final String NORMAL_SEQ = "abcdefghijklmnopqrstuvwxyz";
	
	/**
	 * 解密
	 * @param str
	 * @param moveByte  移动位数
	 * @return
	 */
	public static String decodeMsg(String str, int moveByte) {
		StringBuffer result = new StringBuffer();
		if(str!=null && !str.trim().equals("")) {
			str = str.toLowerCase();
			for(int i=0; i<str.length(); i++) {
				int index = NORMAL_SEQ.indexOf(str.charAt(i));
				int last = index-moveByte;
				if(last>0) {
					result.append(NORMAL_SEQ.charAt(last));
				}else {
					result.append(NORMAL_SEQ.charAt(last+NORMAL_SEQ.length()));
				}
			}
		}
		return result.toString();
	}
	
	/**
	 * 加密
	 * @param str
	 * @param moveByte  移动位数
	 * @return
	 */
	public static String encodeMsg(String str, int moveByte) {
		StringBuffer result = new StringBuffer();
		if(str!=null && !str.trim().equals("")) {
			str = str.toLowerCase();
			for(int i=0; i<str.length(); i++) {
				int index = NORMAL_SEQ.indexOf(str.charAt(i));
				int last = index+moveByte;
				if(last<26) {
					result.append(NORMAL_SEQ.charAt(last));
				}else {
					result.append(NORMAL_SEQ.charAt(last-NORMAL_SEQ.length()));
				}
			}
		}
		return result.toString();
	}
	
	public static void main(String[] args) {
		System.out.println(encodeMsg("yes", 10));
		System.out.println(decodeMsg("ioc", 10));
	}

}
